package com.itheima.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class RunTimeMonitorAdvice {
    // 拦截所有业务层接口中插叙操作的执行
    @Pointcut("execution(* com.itheima.service.*Service.find*(..))")
    public void pt(){

    }
    @Around("pt()")
    public Object runtimeMonitor(ProceedingJoinPoint pjp) throws Throwable {
        // 获取执行签名信息
        Signature signature = pjp.getSignature();
        // 通过前面获取执行类型（接口名）
        String targetClass = signature.getDeclaringTypeName();
        // 通过签名获取执行操作名称（方法名）
        String targetMethod = signature.getName();

        // 执行时常累计值
        long sum = 0L;
        for (int i = 0; i < 10000; i++) {
            // 计算方法执行时间
            long beginTime = System.currentTimeMillis();
            // 执行一万次操作
            pjp.proceed(pjp.getArgs());
            long endTime = System.currentTimeMillis();
            sum += endTime-beginTime;
        }
        System.out.println(targetClass+" 中"+targetMethod+" (万次)运行时长："+sum+" ms");
        return null;
    }
}
